import type { User } from '../stores/auth'

// 用户角色枚举
export enum UserRole {
  ADMIN = 'ADMIN',
  SUB_ADMIN = 'SUB_ADMIN',
  USER = 'USER'
}

// 权限检查工具类
export class PermissionUtils {
  /**
   * 检查用户是否为管理员
   */
  static isAdmin(user?: User | null): boolean {
    return user?.role === UserRole.ADMIN
  }

  /**
   * 检查用户是否为子管理员
   */
  static isSubAdmin(user?: User | null): boolean {
    return user?.role === UserRole.SUB_ADMIN
  }

  /**
   * 检查用户是否有管理员权限（包括管理员和子管理员）
   */
  static hasAdminAccess(user?: User | null): boolean {
    return this.isAdmin(user) || this.isSubAdmin(user)
  }

  /**
   * 检查用户是否为普通用户
   */
  static isRegularUser(user?: User | null): boolean {
    return user?.role === UserRole.USER
  }

  /**
   * 检查用户是否激活
   */
  static isActiveUser(user?: User | null): boolean {
    return user?.isActive === true
  }

  /**
   * 检查用户是否可以访问指定路由
   */
  static canAccessRoute(user: User | null, routeName: string): boolean {
    if (!user || !this.isActiveUser(user)) {
      return false
    }

    switch (routeName) {
      case 'Login':
        // 已登录用户不应该访问登录页
        return false

      case 'Dashboard':
        // 所有已登录用户都可以访问
        return true

      case 'CustomerManagement':
        // 客户管理需要用户管理权限
        return this.canAccessModule(user, 'user_management')

      case 'RechargeOrderCreate':
      case 'RechargeOrderQuery':
        // 充值订单管理需要充值管理权限
        return this.canAccessModule(user, 'recharge_management')

      case 'PayoutOrderCreate':
      case 'PayoutOrderQuery':
        // 支付订单管理需要支付管理权限
        return this.canAccessModule(user, 'payout_management')

      case 'AdminSettings':
        // 管理员设置只有管理员可以访问
        return this.isAdmin(user)

      default:
        // 默认允许访问
        return true
    }
  }

  /**
   * 检查用户是否可以执行指定操作
   */
  static canPerformAction(user: User | null, action: string, targetUser?: User): boolean {
    if (!user || !this.isActiveUser(user)) {
      return false
    }

    switch (action) {
      case 'create_user':
        return this.hasAdminAccess(user)

      case 'create_sub_admin':
        return this.isAdmin(user)

      case 'edit_user':
        if (!targetUser) return false
        // 管理员可以编辑所有用户，子管理员只能编辑普通用户
        if (this.isAdmin(user)) return true
        if (this.isSubAdmin(user)) return this.isRegularUser(targetUser)
        // 用户只能编辑自己
        return user.id === targetUser.id

      case 'delete_user':
        if (!targetUser) return false
        // 不能删除自己
        if (user.id === targetUser.id) return false
        // 管理员可以删除除自己外的所有用户，子管理员只能删除普通用户
        if (this.isAdmin(user)) return true
        if (this.isSubAdmin(user)) return this.isRegularUser(targetUser)
        return false

      case 'view_admin_panel':
        return this.hasAdminAccess(user)

      case 'view_system_stats':
        return this.hasAdminAccess(user)

      case 'manage_sub_admins':
        return this.isAdmin(user)

      case 'change_user_role':
        if (!targetUser) return false
        // 只有超级管理员可以修改用户角色
        return this.isAdmin(user)

      case 'deactivate_user':
        if (!targetUser) return false
        // 不能停用自己
        if (user.id === targetUser.id) return false
        // 管理员可以停用除自己外的所有用户，子管理员只能停用普通用户
        if (this.isAdmin(user)) return true
        if (this.isSubAdmin(user)) return this.isRegularUser(targetUser)
        return false

      default:
        return false
    }
  }

  /**
   * 获取用户角色的显示名称
   */
  static getRoleDisplayName(role: string): string {
    switch (role) {
      case UserRole.ADMIN:
        return 'Administrator'
      case UserRole.SUB_ADMIN:
        return 'Sub Administrator'
      case UserRole.USER:
        return 'User'
      default:
        return 'Unknown'
    }
  }

  /**
   * 获取用户角色的颜色类
   */
  static getRoleColorClass(role: string): string {
    switch (role) {
      case UserRole.ADMIN:
        return 'bg-red-100 text-red-800'
      case UserRole.SUB_ADMIN:
        return 'bg-yellow-100 text-yellow-800'
      case UserRole.USER:
        return 'bg-green-100 text-green-800'
      default:
        return 'bg-gray-100 text-gray-800'
    }
  }

  /**
   * 检查用户是否可以访问某个功能模块
   */
  static canAccessModule(user: User | null, module: string): boolean {
    if (!user || !this.isActiveUser(user)) {
      return false
    }

    switch (module) {
      case 'user_management':
        return this.hasAdminAccess(user)

      case 'sub_admin_management':
        return this.isAdmin(user)

      case 'system_settings':
        return this.isAdmin(user)

      case 'audit_logs':
        return this.hasAdminAccess(user)

      case 'recharge_management':
        // 管理员和通过Customer Management创建的普通用户都可以访问
        return this.hasAdminAccess(user) || (user.role === 'USER' && user.createdByAdminId !== null)

      case 'payout_management':
        // 只有管理员可以访问支付管理功能
        return this.hasAdminAccess(user)

      case 'profile_management':
        return true // 所有用户都可以管理自己的资料

      default:
        return false
    }
  }

  /**
   * 获取用户可访问的菜单项
   */
  static getAccessibleMenuItems(user: User | null): Array<{
    name: string
    path: string
    icon: string
    requiresAdmin?: boolean
    requiresSuperAdmin?: boolean
  }> {
    const menuItems: Array<{
      name: string
      path: string
      icon: string
      requiresAdmin?: boolean
      requiresSuperAdmin?: boolean
    }> = [
      {
        name: 'Dashboard',
        path: '/dashboard',
        icon: 'home'
      }
    ]

    // 充值管理菜单
    if (this.canAccessModule(user, 'recharge_management')) {
      menuItems.push({
        name: 'Create Recharge',
        path: '/recharge/create',
        icon: 'document',
        requiresAdmin: true
      })
      menuItems.push({
        name: 'Recharge Orders',
        path: '/recharge/query',
        icon: 'document',
        requiresAdmin: true
      })
    }

    // 支付管理菜单
    if (this.canAccessModule(user, 'payout_management')) {
      menuItems.push({
        name: 'Create Payout',
        path: '/payout/create',
        icon: 'tools',
        requiresAdmin: true
      })
      menuItems.push({
        name: 'Payout Orders',
        path: '/payout/query',
        icon: 'tools',
        requiresAdmin: true
      })
    }

    // 用户管理菜单
    if (this.canAccessModule(user, 'user_management')) {
      menuItems.push({
        name: 'Customers',
        path: '/customers',
        icon: 'user',
        requiresAdmin: true
      })
    }

    return menuItems.filter(item => {
      if (item.requiresSuperAdmin) {
        return this.isAdmin(user)
      }
      if (item.requiresAdmin) {
        return this.hasAdminAccess(user)
      }
      return true
    })
  }
}
